package principal;

/**
 * Javier Abell�n, 24 Mayo 2006
 * Panel de paint.
 */

import java.awt.BasicStroke;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.geom.Point2D;
import java.util.LinkedList;
import javax.swing.JButton;

/**
 * Panel similar a un paintbrush de windows, que permite dibujar trazos
 * arrastrando el rat�n.
 * 
 * @author Chuidiang.
 */
public class PanelPaint extends Canvas {
	/**
	 * serial uid
	 */

    JButton boton_borrar, boton_clear, boton_ok;
	private static final long serialVersionUID = 3978706198935583032L;

	/** Lista de formas ya reconocidas */

	
	
	private LinkedList<Forma> formas = new LinkedList<Forma>();

	/** Lista de formas ya reconocidas */
	private LinkedList<Calle> calles = new LinkedList<Calle>();

	/**
	 * Acci�n de pintar trazo mientrasa se arrastra el rat�n
	 * 
	 * @uml.property name="pintaTrazo"
	 * @uml.associationEnd
	 */
	private PintaTrazo pintaTrazo = null;

	/**
	 * Clase suscriptora de los arrastres de rat�n
	 * 
	 * @uml.property name="listener"
	 * @uml.associationEnd
	 */
	private ListenerArrastre listener = null;

	/** Lista de trazos dibujados */
	private LinkedList<Trazo> trazos = new LinkedList<Trazo>();

	/** Lista de trazos dibujados */
	private LinkedList<Linea> lineas = new LinkedList<Linea>();

	
	/**
	 * Indica si estamos en modo de arrastre de trazos o de dibujo de los
	 * mismos.
	 */
	private boolean modoArrastrar = false;


        public PintaTrazo getPintaTrazo(){
            return pintaTrazo;
        }

	/**
	 * Pone el modo de dibujo de trazos.
	 * 
	 */
	public void modoPintar() {
		listener.setAccion(pintaTrazo);
		modoArrastrar = false;
	}

	/**
	 * Crea una intancia de esta clase, inicializando todo.
	 * 
	 */
	public PanelPaint(JButton b1, JButton b2, JButton b3) {
		boton_clear = b1;
                boton_borrar = b2;
                boton_ok = b3;
                pintaTrazo = new PintaTrazo(trazos, formas, lineas, calles, this);
		listener = new ListenerArrastre(pintaTrazo);
		addMouseMotionListener(listener);
		addMouseListener(listener);
	}

	/**
	 * Si el modo es arrastre, borra el canvas entero. Si no, no lo hace. Luego
	 * llama a paint(g)
	 */
    @Override
	public void update(Graphics g) {
		if (modoArrastrar)
			super.update(g);
		paint(g);
	}

	/**
	 * Dibuja los trazos en este componente
	 */
    @Override
	public void paint(Graphics g) {
		
                if(pintaTrazo.getModo()==PintaTrazo.MODO_ESCRITURA){
                    boton_borrar.setEnabled(false);
                    boton_clear.setEnabled(false);
                    boton_ok.setEnabled(true);
                }else{
                    boton_ok.setEnabled(false);
                    if(calles.isEmpty() && formas.isEmpty() && lineas.isEmpty()){
                        boton_borrar.setEnabled(false);
                        boton_clear.setEnabled(false);
                    }else{
                        boton_borrar.setEnabled(true);
                        boton_clear.setEnabled(true);
                    }
                }


		if(pintaTrazo.isBorrando()){
			g.setColor(Color.WHITE);
			g.fillRect(0, 0, this.getWidth(), this.getHeight());
			g.setColor(Color.BLACK);
			pintaTrazo.setBorrando(false);
		}
				
		if (pintaTrazo.getModo() != PintaTrazo.MODO_ESCRITURA) {
			if (pintaTrazo.isPintando()) {
				for (int i = 0; i < trazos.size(); i++) {
					dibujaTrazo(trazos.get(i), g);
				}
			}else{
				for (int i = 0; i < trazos.size(); i++) {
					borraTrazo(trazos.get(i), g);
				}
				trazos.clear();
				Graphics2D g2 = (Graphics2D)g;
				g2.setColor(Color.WHITE);
				g2.fillRect(0, 0, 1200, 200);
				g2.fillRect(1100, 200, 1200, 200);
				g2.setColor(Color.BLACK);
				for (int i = 0; i < calles.size(); i++) {
					dibujaCalle(calles.get(i), g);
				}
				for (int i = 0; i < formas.size(); i++) {
					dibujaForma(formas.get(i), g);
				}
				for (int i = 0; i < lineas.size(); i++) {
					dibujaLinea(lineas.get(i), g);
				}
			}
		} if (pintaTrazo.getModo() == PintaTrazo.MODO_ESCRITURA){
			Graphics2D gb = (Graphics2D)g;
			gb.setColor(Color.GRAY);
			gb.fillRect(0, 0, 1200, 200);

                        //Aquí tendria que jbutton5.setenable

			for (int i = 0; i < trazos.size(); i++) {
				dibujaTrazo(trazos.get(i), g);
			}			
		}
	}
	
	private void borraTrazo(Trazo trazo, Graphics g) {
		g.setColor(Color.WHITE);
		Point2D p0 = trazo.getPunto(0);
		Graphics2D g2 = (Graphics2D) g;
		g2.setStroke(new BasicStroke(1));
		for (int i = 0; i < trazo.getNumeroPuntos() - 1; i++) {
			Point2D p1 = trazo.getPunto(i + 1);
			g2.drawLine((int) p0.getX(), (int) p0.getY(), (int) p1.getX(),
					(int) p1.getY());
			p0 = p1;
		}
		
	}


	private void dibujaCalle(Calle calle, Graphics g) {
		if (calle.getAnchura() == 1) {
			if (calle.getPosicion() == 1){
				g.drawImage(
						Toolkit.getDefaultToolkit().getImage("src/images/calle_1.JPG"),
						10, 16, this);
				if(calle.getCadena()!=null){
					g.drawString(calle.getCadena(), 25, 120);
				}
			}
			if (calle.getPosicion() == 2){
				g.drawImage(
						Toolkit.getDefaultToolkit().getImage("src/images/calle_1.JPG"),
						10, 256, this);
				if(calle.getCadena()!=null){
					g.drawString(calle.getCadena(), 25, 362);
				}
			}
			if (calle.getPosicion() == 3){
				g.drawImage(
						Toolkit.getDefaultToolkit().getImage("src/images/calle_1.JPG"),
						10, 496, this);
				if(calle.getCadena()!=null){
					g.drawString(calle.getCadena(), 25, 604);
				}
			}
		}
		if (calle.getAnchura() == 2) {
			if (calle.getPosicion() == 1){
				g.drawImage(
						Toolkit.getDefaultToolkit().getImage("src/images/calle_2.JPG"),
						10, 16, this);
				if(calle.getCadena()!=null){
					g.drawString(calle.getCadena(), 25, 200);
				}
			}
			if (calle.getPosicion() == 2){
				g.drawImage(
						Toolkit.getDefaultToolkit().getImage("src/images/calle_2.JPG"),
						10, 256, this);
				if(calle.getCadena()!=null){
					g.drawString(calle.getCadena(), 25, 450);
				}
			}

		}
		if (calle.getAnchura() == 3) {
			g.drawImage(Toolkit.getDefaultToolkit().getImage("src/images/calle_3.JPG"),
					10, 16, this);
			if(calle.getCadena()!=null){
				g.drawString(calle.getCadena(), 25, 300);
			}
		}

	}

	private void dibujaLinea(Linea linea, Graphics g) {
		// TODO Auto-generated method stub
		Point2D or = linea.getOrigen();
		Point2D dest = linea.getDestino();
		Graphics2D g2d = (Graphics2D) g;
		if (linea.getTipo() == 1)// linea continua
			g2d.setStroke(new BasicStroke(2));
		if (linea.getTipo() == 2)// linea discontinua
			g2d.setStroke(new BasicStroke(2f, BasicStroke.CAP_ROUND,
					BasicStroke.JOIN_ROUND, 1f, new float[] { 5f }, 0f));
		if (linea.getTipo() == 3)// linea punteada
			g2d.setStroke(new BasicStroke(2f, BasicStroke.CAP_ROUND,
					BasicStroke.JOIN_ROUND, 1f, new float[] { 3f }, 0f));

		g2d.drawLine((int) or.getX(), (int) or.getY(), (int) dest.getX(),
				(int) dest.getY());

	}

	private void dibujaForma(Forma forma, Graphics g) {
		// Recorre las formas y pinta las imagenes que corresponda

		if (forma.getTipo() == 1) {
			g.drawImage(Toolkit.getDefaultToolkit().getImage("src/images/actividad.JPG"),
					(int) forma.getPos().getX(), (int) forma.getPos().getY(),
					this);
			if(forma.getCadena()!=null){
				g.drawString(forma.getCadena(), (int) forma.getPos().getX()+50, (int) forma.getPos().getY()+35);
			}
		}
		if (forma.getTipo() == 2) {
			g.drawImage(Toolkit.getDefaultToolkit().getImage("src/images/documento.JPG"),
					(int) forma.getPos().getX(), (int) forma.getPos().getY(),
					this);
		}
		if (forma.getTipo() == 3) {
			g.drawImage(Toolkit.getDefaultToolkit().getImage(
					"src/images/circulo_vacio.JPG"), (int) forma.getPos().getX(),
					(int) forma.getPos().getY(), this);
		}
		if (forma.getTipo() == 4) {
			g.drawImage(
					Toolkit.getDefaultToolkit().getImage("src/images/rombo_vacio.JPG"),
					(int) forma.getPos().getX(), (int) forma.getPos().getY(),
					this);

		}
		if (forma.getTipo() == 5) {
			g.drawImage(Toolkit.getDefaultToolkit().getImage(
					"src/images/circulo_sobre.JPG"), (int) forma.getPos().getX(),
					(int) forma.getPos().getY(), this);
		}
		if (forma.getTipo() == 6) {
			g.drawImage(Toolkit.getDefaultToolkit().getImage(
					"src/images/circulo_reloj.JPG"), (int) forma.getPos().getX(),
					(int) forma.getPos().getY(), this);
		}

		if (forma.getTipo() == 7) {
			g.drawImage(Toolkit.getDefaultToolkit().getImage("src/images/rombo_mas.JPG"),
					(int) forma.getPos().getX(), (int) forma.getPos().getY(),
					this);
		}

		if (forma.getTipo() == 8) {
			g.drawImage(Toolkit.getDefaultToolkit().getImage("src/images/rombo_por.JPG"),
					(int) forma.getPos().getX(), (int) forma.getPos().getY(),
					this);
		}

		if (forma.getTipo() == 9) {
			g.drawImage(Toolkit.getDefaultToolkit().getImage(
					"src/images/circulo_inicio.JPG"), (int) forma.getPos().getX(),
					(int) forma.getPos().getY(), this);
		}
		if (forma.getTipo() == 10) {
			g.drawImage(
					Toolkit.getDefaultToolkit().getImage("src/images/circulo_fin.JPG"),
					(int) forma.getPos().getX(), (int) forma.getPos().getY(),
					this);
		}
	}

	/**
	 * Dibuja un trazo en este componente.
	 * 
	 * @param trazo
	 *            Trazo a dibujar.
	 * @param g
	 *            Graphics para dibujo.
	 */
	private void dibujaTrazo(Trazo trazo, Graphics g) {
		g.setColor(trazo.getColor());
		Point2D p0 = trazo.getPunto(0);
		Graphics2D g2 = (Graphics2D) g;
		if(pintaTrazo.getModo()==PintaTrazo.MODO_ESCRITURA)
			g2.setStroke(new BasicStroke(8));
		for (int i = 0; i < trazo.getNumeroPuntos() - 1; i++) {
			Point2D p1 = trazo.getPunto(i + 1);
			g2.drawLine((int) p0.getX(), (int) p0.getY(), (int) p1.getX(),
					(int) p1.getY());
			p0 = p1;
		}

	}

	/**
	 * @param grosor
	 * @uml.property name="grosor"
	 */

	/**
	 * Cambia el color de dibujo del trazo.
	 * 
	 * @param colorActual
	 */
	public void setColorActual(Color colorActual) {
		pintaTrazo.setColorActual(colorActual);
	}
	
}
